/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.Produce;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Rappresenta i dati della produzione giornaliera della fabbrica
 * 
 * @author Valentini
 * @version 1.00
 */
public class SaveProduceDatabase {

	/**
	 * Istruzione di aggiornamento per il database.
	 */
	private static final String UPDATE_STATEMENT = "UPDATE produce " +
			" SET   inproduzione = ? "+
			" WHERE idprodotto = ? AND login = ?;";
	
	/**
	 * Istruzione di eliminaziomne per il database.
	 */
	private static final String DELETE_STATEMENT = " DELETE FROM produce " +
						" WHERE idprodotto = ? AND login = ?;";
		
	/**
	 * Connessione al database
	 */
	private final Connection con;

	/**
	 * L'elemento da modificare
	 */
	private final Produce produce;

	/**
	 * Crea un elemento produce nel database
	 * 
	 * @param con
	 *            connessione al database.
	 * @param produce
	 * 			  l'elemento da inserire o modificare
	 */			
	public SaveProduceDatabase(Connection con, Produce produce) {
		this.con = con;
		this.produce = produce;
	}

	/**
	 * Crea un nuovo elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void createProduce() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			
			String INSERT_STATEMENT= "INSERT INTO produce (idprodotto," +
					"login, qtadaprodurre, inproduzione, capacita, tempoproduzione, costo)" +
					" VALUES ( ?, ?, ?, ?, ?, ?,"+produce.getCosto()+");";
			
			pstmt = con.prepareStatement(INSERT_STATEMENT);
			pstmt.setInt(1, produce.getIdProdotto() );
			pstmt.setString(2, produce.getlogin() );
			pstmt.setInt(3, produce.getQtaDaProdurre());
			pstmt.setInt(4, produce.getInProduzione());
			pstmt.setInt(5, produce.getCapacita() );
			pstmt.setInt(6, produce.getTempoProduzione());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
	
	/**
	 * Aggiorna un elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void updateProduce() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(UPDATE_STATEMENT);
			pstmt.setInt(1, produce.getInProduzione());
			pstmt.setInt(2, produce.getIdProdotto() );
			pstmt.setString(3, produce.getlogin() );
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
	
	/**
	 * Elimina un elemento dal database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteProduce() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT);
			pstmt.setInt(1, produce.getIdProdotto() );
			pstmt.setString(2, produce.getlogin() );
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
	/**
	 * Recupera tutti i campi dal database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 * @return un resultset con i campi di produce e del prodotto associato
	 */
	public ResultSet getProduceProdottoDetails() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			
			String SELECT_STATEMENT= "SELECT nome, costo, tempoproduzione, capacita, qtadaprodurre " +
					   " FROM prodotto INNER JOIN produce ON prodotto.idprodotto = produce.idprodotto "+
					   " WHERE produce.idprodotto = "+ produce.getIdProdotto()+" AND produce.login='"+produce.getlogin()+"';";
			
			pstmt = con.prepareStatement(SELECT_STATEMENT);		
			pstmt.execute();
			ResultSet rs = pstmt.getResultSet();
			return rs;
		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}
}
